895 lines (894 with data), 144.1 kB
{
"cells": [
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"id": "WNXEyZ23rdz-"
},
"outputs": [],
"source": [
"# This cell is added by sphinx-gallery\n",
"# It can be customized to whatever you like\n",
"#from google.colab import drive\n",
"#drive.mount('/content/drive')"
]
},
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "WYVI3RMhAdap"
}
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"id": "sANL984ird0B"
},
"outputs": [],
"source": [
"#!pip install pennylane\n",
"# Some parts of this code are based on the Python script:\n",
"# https://github.com/pytorch/tutorials/blob/master/beginner_source/transfer_learning_tutorial.py\n",
"# License: BSD\n",
"\n",
"import time\n",
"import os\n",
"import copy\n",
"\n",
"# PyTorch\n",
"import torch\n",
"import torch.nn as nn\n",
"import torch.optim as optim\n",
"from torch.optim import lr_scheduler\n",
"import torchvision\n",
"from torchvision import datasets, transforms\n",
"\n",
"# Pennylane\n",
"import pennylane as qml\n",
"from pennylane import numpy as np\n",
"\n",
"torch.manual_seed(42)\n",
"np.random.seed(42)\n",
"\n",
"# Plotting\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# OpenMP: number of parallel threads.\n",
"os.environ[\"OMP_NUM_THREADS\"] = \"1\""
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "o7eGTk_Prd0B"
},
"source": [
"Setting of the main hyper-parameters of the model\n",
"=================================================\n",
"\n",
"::: {.note}\n",
"::: {.title}\n",
"Note\n",
":::\n",
"\n",
"To reproduce the results of Ref. \\[1\\], `num_epochs` should be set to\n",
"`30` which may take a long time. We suggest to first try with\n",
"`num_epochs=1` and, if everything runs smoothly, increase it to a larger\n",
"value.\n",
":::\n"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"id": "Wncy61Mdrd0B"
},
"outputs": [],
"source": [
"n_qubits = 8 # Number of qubits\n",
"step = 0.0006 # Learning rate\n",
"batch_size = 6 # Number of samples for each training step\n",
"num_epochs = 1 # Number of training epochs\n",
"q_depth = 6 # Depth of the quantum circuit (number of variational layers)\n",
"gamma_lr_scheduler = 0.1 # Learning rate reduction applied every 10 epochs.\n",
"q_delta = 0.01 # Initial spread of random quantum weights\n",
"start_time = time.time() # Start of the computation timer"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "PVqjLo8Rrd0B"
},
"source": [
"We initialize a PennyLane device with a `default.qubit` backend.\n"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"id": "qLOa5trRrd0B"
},
"outputs": [],
"source": [
"dev = qml.device(\"default.qubit\", wires=n_qubits)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "dxlK7Jjtrd0C"
},
"source": [
"We configure PyTorch to use CUDA only if available. Otherwise the CPU is\n",
"used.\n"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"id": "Br_YGwRDrd0C"
},
"outputs": [],
"source": [
"device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "WFHuYd5xrd0C"
},
"source": [
"Dataset loading\n",
"===============\n",
"\n",
"::: {.note}\n",
"::: {.title}\n",
"Note\n",
":::\n",
"\n",
"The dataset containing images of *ants* and *bees* can be downloaded\n",
"[here](https://download.pytorch.org/tutorial/hymenoptera_data.zip) and\n",
"should be extracted in the subfolder `../_data/hymenoptera_data`.\n",
":::\n",
"\n",
"This is a very small dataset (roughly 250 images), too small for\n",
"training from scratch a classical or quantum model, however it is enough\n",
"when using *transfer learning* approach.\n",
"\n",
"The PyTorch packages `torchvision` and `torch.utils.data` are used for\n",
"loading the dataset and performing standard preliminary image\n",
"operations: resize, center, crop, normalize, *etc.*\n"
]
},
{
"cell_type": "code",
"source": [
"#os.system(\"rm -rf /content/data/.ipynb_checkpoints\")\n",
"#os.system(\"rm -rf /content/data/braintumor_data/.ipynb_checkpoints\")\n",
"#os.system(\"rm -rf /content/data/braintumor_data/train/.ipynb_checkpoints\")\n",
"#os.system(\"rm -rf /content/data/braintumor_data/val/.ipynb_checkpoints\")"
],
"metadata": {
"id": "DM8SDO3Wthcc"
},
"execution_count": 25,
"outputs": []
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"id": "jQrNNVnUrd0C"
},
"outputs": [],
"source": [
"data_transforms = {\n",
" \"train\": transforms.Compose(\n",
" [\n",
" # transforms.RandomResizedCrop(224), # uncomment for data augmentation\n",
" # transforms.RandomHorizontalFlip(), # uncomment for data augmentation\n",
" transforms.Resize(256),\n",
" transforms.CenterCrop(224),\n",
" transforms.ToTensor(),\n",
" # Normalize input channels using mean values and standard deviations of ImageNet.\n",
" transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),\n",
" ]\n",
" ),\n",
" \"val\": transforms.Compose(\n",
" [\n",
" transforms.Resize(256),\n",
" transforms.CenterCrop(224),\n",
" transforms.ToTensor(),\n",
" transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),\n",
" ]\n",
" ),\n",
"}\n",
"\n",
"data_dir = \"/content/drive/MyDrive/Colab Notebooks/data/4_cl_2xbraintumor_data\"\n",
"image_datasets = {\n",
" x if x == \"train\" else \"validation\": datasets.ImageFolder(\n",
" os.path.join(data_dir, x), data_transforms[x]\n",
" )\n",
" for x in [\"train\", \"val\"]\n",
"}\n",
"dataset_sizes = {x: len(image_datasets[x]) for x in [\"train\", \"validation\"]}\n",
"class_names = image_datasets[\"train\"].classes\n",
"\n",
"# Initialize dataloader\n",
"dataloaders = {\n",
" x: torch.utils.data.DataLoader(image_datasets[x], batch_size=batch_size, shuffle=True)\n",
" for x in [\"train\", \"validation\"]\n",
"}\n",
"\n",
"# function to plot images\n",
"def imshow(inp, title=None):\n",
" \"\"\"Display image from tensor.\"\"\"\n",
" inp = inp.numpy().transpose((1, 2, 0))\n",
" # Inverse of the initial normalization operation.\n",
" mean = np.array([0.485, 0.456, 0.406])\n",
" std = np.array([0.229, 0.224, 0.225])\n",
" inp = std * inp + mean\n",
" inp = np.clip(inp, 0, 1)\n",
" plt.imshow(inp)\n",
" if title is not None:\n",
" plt.title(title)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "piWk71nkrd0C"
},
"source": [
"Let us show a batch of the test data, just to have an idea of the\n",
"classification problem.\n"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 166
},
"id": "u55iZYEOrd0D",
"outputId": "b1886306-9f2d-4421-ba8a-65024c4430fb"
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAloAAACVCAYAAACAelSiAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOy9eXycZbk+fs2S2Wcymclk39qkTdt0XyhF2kIBS2UriCiLgiKi/hQ57uhXhXM8LkePG3oU0QMoiB4QEQQBgbKWQum+J2n2fZk1mclMMvP+/ojX3WcmkzYtLaLNzYdPmjcz7/u8z3I/133dy6PTNE3DtEzLtEzLtEzLtEzLtJx00f+jGzAt0zIt0zIt0zIt0/KvKtNAa1qmZVqmZVqmZVqm5RTJNNCalmmZlmmZlmmZlmk5RTINtKZlWqZlWqZlWqZlWk6RTAOtaZmWaZmWaZmWaZmWUyTTQGtapmVapmVapmVapuUUyTTQmpZpmZZpmZZpmZZpOUUyDbSmZVqmZVqmZVqmZVpOkUwDrWmZlmmZlmmZlmmZllMkxwW0brjhBuh0Ouh0OsyfP/+kNeKcc87BOeecI7+3tLRAp9Ph3nvvPWnPmJbjl7drHG6//XbodLpT+oxpOba8XeNQVVWFG2644ZQ/Z1qm5Whyww03oKqq6qTfV6fT4fbbbz/p9/1nlWz9/M/YR48++qjgH51OhzfffHPK3z1uRis/Px+//e1v8Z3vfCftelVV1T9dx71VeSsg5JxzzpnebP6J5N577z1hEELA+sILL5zcRk3LKZO3sj5vv/32U7KBq7J//37cfvvtaGlpOaXPeTvknaJHo9Eobr/99pO+Tjdv3ozbb78dwWDwpN73eOWd0s//LJKJaZYvX47f/va3+NjHPnbc9zIe7xfsdjuuu+66437Q8UhlZSVisRhycnJO6XOm5ejydo3D//t//w9f/vKXT+kzpuXY8naNw6FDh6DXT0ctvBXZv38/7rjjDpxzzjmnHNT9q8rdd9+NVColv0ejUdxxxx0AkOZhOV6JxWIwGo9srZs3b8Ydd9yBG264AW63+4Tv+68kmX30zyBlZWW47rrrMDY2hl/+8pfH9d135JvqdDpYLJZ/dDNOe3m7xsFoNP7TLbp/RXm7xsFsNp/yZ0zLO1tSqRQSicQ/VM+fKgPy7XgnTdMwMjICq9V6yp91KuR0299PqVm5e/durF27FlarFWVlZfjmN7+Je+65Bzqd7qiU92SxQc8//zxWr14Nu90Ot9uNyy67DAcOHEj7DONM6uvrcd111yE3Nxc+nw9f+9rXoGka2tvbcdlll8HlcqGoqAj//d//nfb9RCKBr3/961i2bBlyc3Nht9uxevVqbNq06WR1S1Z54YUXoNPp8H//93+44447UFpaCqfTiSuvvBKhUAjxeBy33norCgoK4HA48OEPfxjxeHzCfe6//34sW7YMVqsVHo8HH/jAB9De3p72mXPOOQfz58/H/v37ce6558Jms6G0tBT/9V//lfa5bONwww03wOFwoLOzExs3boTD4YDP58PnP/95JJPJtO8PDg7igx/8IFwuF9xuN66//nrs2rVrwj2zxQaNjY3hP/7jP1BdXQ2z2Yyqqip85StfmfDOVVVVuPjii/HCCy9g+fLlsFqtWLBggdD/jzzyCBYsWACLxYJly5Zhx44dad/fvXs3brjhBsycORMWiwVFRUX4yEc+gsHBwaOO11sV9mNbWxsuvvhiOBwOlJaW4mc/+xkAYM+ePVi3bh3sdjsqKyvxu9/9bsI9gsEgbr31VpSXl8NsNqOmpgbf/e5306x0juH3v/99/PKXv5T+XLFiBbZu3Zp2v2zjoNPp8KlPfQqPPvoo5s+fD7PZjLq6Ojz11FMT2sMxsFgsqK6uxl133ZX1ntlitJqamvC+970PHo8HNpsNZ555Jp544okJ93+ra+See+7BunXrUFBQALPZjHnz5uHnP//5JKN08uR4+nHHjh3YsGEDXC4XHA4HzjvvPGzZskX+fu+99+J973sfAODcc8+VmBHO+cniXzL7ne7wV155Bbfccgt8Ph/cbjduvvlmJBIJBINBfOhDH0JeXh7y8vLwxS9+EZqmpd1zeHgYn/vc52QO1tbW4vvf//6Ez/H9H3jgAdTV1cFsNmd997cqnCN/+MMf8JWvfAVFRUWw2+249NJLJ+hBNXaopaUFPp8PAHDHHXdIn7IfM+OIs92Don7v9ttvxxe+8AUAwIwZM+S+3P+mOh+p555++mnRc3fddRfWrl2LRYsWZe2L2tparF+/fgq9dmLS2tqKSy+9FHa7HQUFBfi3f/s3PP3001MKk8g2R48174GTM2e///3v46yzzoLX64XVasWyZcvw8MMPn4wumVROmfna2dkpSuC2226D3W7Hr371qxO2Zp999lls2LABM2fOxO23345YLIY777wT73rXu7B9+/YJk/39738/5s6di+985zt44okn8M1vfhMejwd33XUX1q1bh+9+97t44IEH8PnPfx4rVqzAmjVrAADhcBi/+tWvcPXVV+Omm25CJBLBr3/9a6xfvx5vvPEGFi9e/BZ75ujy7W9/G1arFV/+8pfR2NiIO++8Ezk5OdDr9QgEArj99tuxZcsW3HvvvZgxYwa+/vWvy3f/8z//E1/72tdw1VVX4aMf/Sj6+/tx5513Ys2aNdixY0cabR0IBHDhhRfiiiuuwFVXXYWHH34YX/rSl7BgwQJs2LDhqG1MJpNYv349Vq5cie9///t49tln8d///d+orq7GJz7xCQDjFusll1yCN954A5/4xCcwZ84c/PnPf8b1118/pX746Ec/ivvuuw9XXnklPve5z+H111/Ht7/9bRw4cAB/+tOf0j7b2NiIa665BjfffDOuu+46fP/738cll1yCX/ziF/jKV76CT37yk9K3V111VZrr6m9/+xuamprw4Q9/GEVFRdi3bx9++ctfYt++fdiyZcspDQ5PJpPYsGED1qxZg//6r//CAw88gE996lOw2+346le/imuvvRZXXHEFfvGLX+BDH/oQVq1ahRkzZgAYd3OsXbsWnZ2duPnmm1FRUYHNmzfjtttuQ3d3N370ox+lPet3v/sdIpEIbr75Zuh0OvzXf/0XrrjiCjQ1NR3Tsn/llVfwyCOP4JOf/CScTid+8pOf4L3vfS/a2trg9XoBjCvJCy+8EMXFxbjjjjuQTCbx7//+77J5HU16e3tx1llnIRqN4pZbboHX68V9992HSy+9FA8//DAuv/zytM+/lTXy85//HHV1dbj00kthNBrx+OOP45Of/CRSqRT+v//v/5vKsJ2wTKUf9+3bh9WrV8PlcuGLX/wicnJycNddd+Gcc87Biy++iJUrV2LNmjW45ZZb8JOf/ARf+cpXMHfuXACQn8crn/70p1FUVIQ77rgDW7ZswS9/+Uu43W5s3rwZFRUV+Na3voUnn3wS3/ve9zB//nx86EMfAjDOqlx66aXYtGkTbrzxRixevBhPP/00vvCFL6CzsxM//OEP057z/PPP4//+7//wqU99Cvn5+afU5fmf//mf0Ol0+NKXvoS+vj786Ec/wvnnn4+dO3dmZYF8Ph9+/vOf4xOf+AQuv/xyXHHFFQCAhQsXvqV2XHHFFaivr8eDDz6IH/7wh8jPz5fnAcc3Hw8dOoSrr74aN998M2666SbU1tbC4XDgpptuwt69e9MS1LZu3Yr6+nr8v//3/95S+yeT4eFhrFu3Dt3d3fjMZz6DoqIi/O53vzthQmIq816VE52zAPDjH/8Yl156Ka699lokEgn8/ve/x/ve9z785S9/wUUXXfSW+mVS0Y5Drr/+eq2ysnJKn/30pz+t6XQ6bceOHXJtcHBQ83g8GgCtublZrq9du1Zbu3at/N7c3KwB0O655x65tnjxYq2goEAbHByUa7t27dL0er32oQ99SK594xvf0ABoH/vYx+Ta2NiYVlZWpul0Ou073/mOXA8EAprVatWuv/76tM/G4/G0dwkEAlphYaH2kY98ZErvfiKyadMmDYA2f/58LZFIyPWrr75a0+l02oYNG9I+v2rVqrSxaGlp0QwGg/af//mfaZ/bs2ePZjQa066vXbtWA6D95je/kWvxeFwrKirS3vve98q1bONw/fXXawC0f//3f097zpIlS7Rly5bJ73/84x81ANqPfvQjuZZMJrV169ZNuCfHjLJz504NgPbRj3407Rmf//znNQDa888/L9cqKys1ANrmzZvl2tNPP60B0KxWq9ba2irX77rrLg2AtmnTJrkWjUa1THnwwQc1ANpLL7004W8nS9iP3/rWt+Qa56NOp9N+//vfy/WDBw9qALRvfOMbcu0//uM/NLvdrtXX16fd98tf/rJmMBi0trY2TdOOjKHX69X8fr987s9//rMGQHv88cflWuY4aJqmAdBMJpPW2Ngo13bt2qUB0O688065dskll2g2m03r7OyUaw0NDZrRaJxwz8rKyrQ1d+utt2oAtJdfflmuRSIRbcaMGVpVVZWWTCY1TXvra0TTso/3+vXrtZkzZ064fjJlqv24ceNGzWQyaYcPH5ZrXV1dmtPp1NasWSPXHnrooQlzWX2WOlcomf1+zz33aAC09evXa6lUSq6vWrVK0+l02sc//nG5Rh2q6ulHH31UA6B985vfTHvOlVdeqel0urR3BaDp9Xpt37592TvoJAnnSGlpqRYOh+X6//3f/2kAtB//+MdyLXM/6+/vn7TvMveoye6haRP7/3vf+96EPY8y1flIPffUU0+lXQ8Gg5rFYtG+9KUvpV2/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tmwZAOCrX/0qPvCBDyAnJweXXHLJW56PqixZsgTz58/HQw89hLlz52Lp0qVT+t6J9vPNN9+Mn/70p7j66qvxmc98BsXFxXjggQekEOnx7u9TnfdvVS666CL84Ac/wIUXXohrrrkGfX19+NnPfoaamhrs3r37pD0nU04Zo1VeXo5NmzZh7ty5+Na3voUf/ehHuP766yUz6Hgrw55//vl46qmn4PV68fWvfx3f//73ceaZZ+LVV189qUGWN9xwA771rW9h165duOWWW/D000/j/vvvx/Lly4/5XQKx4uLik9ae45Evf/nLsjHdcccd+PznP4/HHnsM7373u9OyQ94OMRgMeOKJJ/D+978f9913H7761a+ipKREGK1jjf+vfvUr3HHHHdi6dStuvfVWPP/887jtttvw+9///qS283e/+x3Wr1+Pn/3sZ7jtttuQk5MzJRYG+MeOt81mw4svvogvfOELeOGFF/CZz3wG3/nOd9DQ0IA77rhDgkPfLlm2bBn++te/Ii8vD1/72tfw61//Gv/+7/+O884775hjXVhYiM2bN+OCCy7AnXfeidtuuw0mkwmPP/74hBpab0Vqa2vx8MMPQ6fT4fOf/zx+8Ytf4GMf+xg+85nPTOn7Q0NDKCoqOmntySZ1dXV4+eWXMX/+fHz729/GHXfcIW54tZZQUVERfvGLX6Cvrw833ngjrr76asnOvOmmm/ClL30JL730Ej73uc+hubkZf/vb3056Bpper8djjz2GW2+9FX/5y19w6623Yv/+/fje974n7POJyMlYV1/5yldw0UUX4dvf/jZ+/OMf47zzzsNzzz03ITknU371q1+htLQU//Zv/4arr75aClnOnTsXv/nNbxAKhfDZz34Wjz32GH77299OCdCsWLEC//Ef/4Fdu3bhhhtuwNVXX43+/v63PB8zhbWiphoE/1b62eFw4Pnnn8e6devw4x//GN/85jexevVqfO1rXwNw/Pv7VOf9W5V169bh17/+NXp6enDrrbfiwQcfxHe/+92TqmeyypQLQWjj9TDKy8u1/v5+LRAIHM9XRT7zmc9oFotFGxsbO6Hvv5PliSee0HQ6nbZ79+5/dFPesfKnP/1JA6C98sor/+imvGV53/vep61YseIf3Yx3tFx22WVaTU3NP7oZb1nC4bBmNBq1n/70p//opvzLy1vRo6yj9dBDD52C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\n"
},
"metadata": {}
}
],
"source": [
"# Get a batch of training data\n",
"inputs, classes = next(iter(dataloaders[\"validation\"]))\n",
"\n",
"# Make a grid from batch\n",
"out = torchvision.utils.make_grid(inputs)\n",
"\n",
"imshow(out, title=[class_names[x] for x in classes])\n",
"\n",
"dataloaders = {\n",
" x: torch.utils.data.DataLoader(image_datasets[x], batch_size=batch_size, shuffle=True)\n",
" for x in [\"train\", \"validation\"]\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ds09ighxrd0D"
},
"source": [
"Variational quantum circuit\n",
"===========================\n",
"\n",
"We first define some quantum layers that will compose the quantum\n",
"circuit.\n"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"id": "OIbOa-KBrd0D"
},
"outputs": [],
"source": [
"def H_layer(nqubits):\n",
" \"\"\"Layer of single-qubit Hadamard gates.\n",
" \"\"\"\n",
" for idx in range(nqubits):\n",
" qml.Hadamard(wires=idx)\n",
"\n",
"\n",
"def RY_layer(w):\n",
" \"\"\"Layer of parametrized qubit rotations around the y axis.\n",
" \"\"\"\n",
" for idx, element in enumerate(w):\n",
" qml.RY(element, wires=idx)\n",
"\n",
"\n",
"def entangling_layer(nqubits):\n",
" \"\"\"Layer of CNOTs followed by another shifted layer of CNOT.\n",
" \"\"\"\n",
" # In other words it should apply something like :\n",
" # CNOT CNOT CNOT CNOT... CNOT\n",
" # CNOT CNOT CNOT... CNOT\n",
" for i in range(0, nqubits - 1, 2): # Loop over even indices: i=0,2,...N-2\n",
" qml.CNOT(wires=[i, i + 1])\n",
" for i in range(1, nqubits - 1, 2): # Loop over odd indices: i=1,3,...N-3\n",
" qml.CNOT(wires=[i, i + 1])"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Ue__y4sQrd0D"
},
"source": [
"Now we define the quantum circuit through the PennyLane\n",
"[qnode]{.title-ref} decorator .\n",
"\n",
"The structure is that of a typical variational quantum circuit:\n",
"\n",
"- **Embedding layer:** All qubits are first initialized in a balanced\n",
" superposition of *up* and *down* states, then they are rotated\n",
" according to the input parameters (local embedding).\n",
"- **Variational layers:** A sequence of trainable rotation layers and\n",
" constant entangling layers is applied.\n",
"- **Measurement layer:** For each qubit, the local expectation value\n",
" of the $Z$ operator is measured. This produces a classical output\n",
" vector, suitable for additional post-processing.\n"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"id": "C-O_cK6jrd0D"
},
"outputs": [],
"source": [
"@qml.qnode(dev, interface=\"torch\")\n",
"def quantum_net(q_input_features, q_weights_flat):\n",
" \"\"\"\n",
" The variational quantum circuit.\n",
" \"\"\"\n",
"\n",
" # Reshape weights\n",
" q_weights = q_weights_flat.reshape(q_depth, n_qubits)\n",
"\n",
" # Start from state |+> , unbiased w.r.t. |0> and |1>\n",
" H_layer(n_qubits)\n",
"\n",
" # Embed features in the quantum node\n",
" RY_layer(q_input_features)\n",
" RY_layer(q_input_features)\n",
" RY_layer(q_input_features)\n",
"\n",
" # Sequence of trainable variational layers\n",
" for k in range(q_depth):\n",
" entangling_layer(n_qubits)\n",
" RY_layer(q_weights[k])\n",
"\n",
" # Expectation values in the Z basis\n",
" exp_vals = [qml.expval(qml.PauliZ(position)) for position in range(n_qubits)]\n",
" return tuple(exp_vals)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "7FNHREgVrd0D"
},
"source": [
"Dressed quantum circuit\n",
"=======================\n",
"\n",
"We can now define a custom `torch.nn.Module` representing a *dressed*\n",
"quantum circuit.\n",
"\n",
"This is a concatenation of:\n",
"\n",
"- A classical pre-processing layer (`nn.Linear`).\n",
"- A classical activation function (`torch.tanh`).\n",
"- A constant `np.pi/2.0` scaling.\n",
"- The previously defined quantum circuit (`quantum_net`).\n",
"- A classical post-processing layer (`nn.Linear`).\n",
"\n",
"The input of the module is a batch of vectors with 512 real parameters\n",
"(features) and the output is a batch of vectors with two real outputs\n",
"(associated with the two classes of images: *ants* and *bees*).\n"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"id": "C96kWCjWrd0D"
},
"outputs": [],
"source": [
"class DressedQuantumNet(nn.Module):\n",
" \"\"\"\n",
" Torch module implementing the *dressed* quantum net.\n",
" \"\"\"\n",
"\n",
" def __init__(self):\n",
" \"\"\"\n",
" Definition of the *dressed* layout.\n",
" \"\"\"\n",
"\n",
" super().__init__()\n",
" self.pre_net = nn.Linear(512, n_qubits)\n",
" self.q_params = nn.Parameter(q_delta * torch.randn(q_depth * n_qubits))\n",
" self.post_net = nn.Linear(n_qubits, 4)\n",
"\n",
" def forward(self, input_features):\n",
" \"\"\"\n",
" Defining how tensors are supposed to move through the *dressed* quantum\n",
" net.\n",
" \"\"\"\n",
"\n",
" # obtain the input features for the quantum circuit\n",
" # by reducing the feature dimension from 512 to 4\n",
" pre_out = self.pre_net(input_features)\n",
" q_in = torch.tanh(pre_out) * np.pi / 2.0\n",
"\n",
" # Apply the quantum circuit to each element of the batch and append to q_out\n",
" q_out = torch.Tensor(0, n_qubits)\n",
" q_out = q_out.to(device)\n",
" for elem in q_in:\n",
" q_out_elem = torch.hstack(quantum_net(elem, self.q_params)).float().unsqueeze(0)\n",
" q_out = torch.cat((q_out, q_out_elem))\n",
"\n",
" # return the two-dimensional prediction from the postprocessing layer\n",
" return self.post_net(q_out)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "7hQlpDQdrd0D"
},
"source": [
"Hybrid classical-quantum model\n",
"==============================\n",
"\n",
"We are finally ready to build our full hybrid classical-quantum network.\n",
"We follow the *transfer learning* approach:\n",
"\n",
"1. First load the classical pre-trained network *ResNet18* from the\n",
" `torchvision.models` zoo.\n",
"2. Freeze all the weights since they should not be trained.\n",
"3. Replace the last fully connected layer with our trainable dressed\n",
" quantum circuit (`DressedQuantumNet`).\n",
"\n",
"::: {.note}\n",
"::: {.title}\n",
"Note\n",
":::\n",
"\n",
"The *ResNet18* model is automatically downloaded by PyTorch and it may\n",
"take several minutes (only the first time).\n",
":::\n"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"id": "MAh4FqBYrd0D"
},
"outputs": [],
"source": [
"model_hybrid = torchvision.models.resnet18(pretrained=True)\n",
"\n",
"for param in model_hybrid.parameters():\n",
" param.requires_grad = False\n",
"\n",
"\n",
"# Notice that model_hybrid.fc is the last layer of ResNet18\n",
"model_hybrid.fc = DressedQuantumNet()\n",
"\n",
"# Use CUDA or CPU according to the \"device\" object.\n",
"model_hybrid = model_hybrid.to(device)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ovX-Tkb0rd0E"
},
"source": [
"Training and results\n",
"====================\n",
"\n",
"Before training the network we need to specify the *loss* function.\n",
"\n",
"We use, as usual in classification problem, the *cross-entropy* which is\n",
"directly available within `torch.nn`.\n"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"id": "gkmFIK4Brd0E"
},
"outputs": [],
"source": [
"criterion = nn.CrossEntropyLoss()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "qhFORuvard0E"
},
"source": [
"We also initialize the *Adam optimizer* which is called at each training\n",
"step in order to update the weights of the model.\n"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"id": "_K9M-VPMrd0E"
},
"outputs": [],
"source": [
"optimizer_hybrid = optim.Adam(model_hybrid.fc.parameters(), lr=step)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "IGG8pksyrd0E"
},
"source": [
"We schedule to reduce the learning rate by a factor of\n",
"`gamma_lr_scheduler` every 10 epochs.\n"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"id": "nco3IrE6rd0E"
},
"outputs": [],
"source": [
"exp_lr_scheduler = lr_scheduler.StepLR(\n",
" optimizer_hybrid, step_size=10, gamma=gamma_lr_scheduler\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "yJvpPNCRrd0E"
},
"source": [
"What follows is a training function that will be called later. This\n",
"function should return a trained model that can be used to make\n",
"predictions (classifications).\n"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"id": "8uO5BrOPrd0E"
},
"outputs": [],
"source": [
"def train_model(model, criterion, optimizer, scheduler, num_epochs):\n",
" since = time.time()\n",
" best_model_wts = copy.deepcopy(model.state_dict())\n",
" best_acc = 0.0\n",
" best_loss = 10000.0 # Large arbitrary number\n",
" best_acc_train = 0.0\n",
" best_loss_train = 10000.0 # Large arbitrary number\n",
" print(\"Training started:\")\n",
"\n",
" for epoch in range(num_epochs):\n",
"\n",
" # Each epoch has a training and validation phase\n",
" for phase in [\"train\", \"validation\"]:\n",
" if phase == \"train\":\n",
" # Set model to training mode\n",
" model.train()\n",
" else:\n",
" # Set model to evaluate mode\n",
" model.eval()\n",
" running_loss = 0.0\n",
" running_corrects = 0\n",
"\n",
" # Iterate over data.\n",
" n_batches = dataset_sizes[phase] // batch_size\n",
" it = 0\n",
" for inputs, labels in dataloaders[phase]:\n",
" since_batch = time.time()\n",
" batch_size_ = len(inputs)\n",
" inputs = inputs.to(device)\n",
" labels = labels.to(device)\n",
" optimizer.zero_grad()\n",
"\n",
" # Track/compute gradient and make an optimization step only when training\n",
" with torch.set_grad_enabled(phase == \"train\"):\n",
" outputs = model(inputs)\n",
" _, preds = torch.max(outputs, 1)\n",
" loss = criterion(outputs, labels)\n",
" if phase == \"train\":\n",
" loss.backward()\n",
" optimizer.step()\n",
"\n",
" # Print iteration results\n",
" running_loss += loss.item() * batch_size_\n",
" batch_corrects = torch.sum(preds == labels.data).item()\n",
" running_corrects += batch_corrects\n",
" print(\n",
" \"Phase: {} Epoch: {}/{} Iter: {}/{} Batch time: {:.4f}\".format(\n",
" phase,\n",
" epoch + 1,\n",
" num_epochs,\n",
" it + 1,\n",
" n_batches + 1,\n",
" time.time() - since_batch,\n",
" ),\n",
" end=\"\\r\",\n",
" flush=True,\n",
" )\n",
" it += 1\n",
"\n",
" # Print epoch results\n",
" epoch_loss = running_loss / dataset_sizes[phase]\n",
" epoch_acc = running_corrects / dataset_sizes[phase]\n",
" print(\n",
" \"Phase: {} Epoch: {}/{} Loss: {:.4f} Acc: {:.4f} \".format(\n",
" \"train\" if phase == \"train\" else \"validation \",\n",
" epoch + 1,\n",
" num_epochs,\n",
" epoch_loss,\n",
" epoch_acc,\n",
" )\n",
" )\n",
"\n",
" # Check if this is the best model wrt previous epochs\n",
" if phase == \"validation\" and epoch_acc > best_acc:\n",
" best_acc = epoch_acc\n",
" best_model_wts = copy.deepcopy(model.state_dict())\n",
" if phase == \"validation\" and epoch_loss < best_loss:\n",
" best_loss = epoch_loss\n",
" if phase == \"train\" and epoch_acc > best_acc_train:\n",
" best_acc_train = epoch_acc\n",
" if phase == \"train\" and epoch_loss < best_loss_train:\n",
" best_loss_train = epoch_loss\n",
" \n",
" # Update learning rate\n",
" if phase == \"train\":\n",
" scheduler.step()\n",
"\n",
" # Print final results\n",
" model.load_state_dict(best_model_wts)\n",
" time_elapsed = time.time() - since\n",
" print(\n",
" \"Training completed in {:.0f}m {:.0f}s\".format(time_elapsed // 60, time_elapsed % 60)\n",
" )\n",
" print(\"Best test loss: {:.4f} | Best test accuracy: {:.4f}\".format(best_loss, best_acc))\n",
" return model"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "CmAl9fIQrd0E"
},
"source": [
"We are ready to perform the actual training process.\n"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 394
},
"id": "rAQBdDA_rd0E",
"outputId": "624947ea-2a42-4c9b-c85b-65a18bfac28c"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Training started:\n",
"Phase: train Epoch: 1/1 Loss: 1.3012 Acc: 0.3722 \n"
]
},
{
"output_type": "error",
"ename": "KeyboardInterrupt",
"evalue": "ignored",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-36-bbd0ce1e21df>\u001b[0m in \u001b[0;36m<cell line: 1>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m model_hybrid = train_model(\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mmodel_hybrid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcriterion\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptimizer_hybrid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexp_lr_scheduler\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnum_epochs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnum_epochs\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m )\n",
"\u001b[0;32m<ipython-input-35-c4a83313be75>\u001b[0m in \u001b[0;36mtrain_model\u001b[0;34m(model, criterion, optimizer, scheduler, num_epochs)\u001b[0m\n\u001b[1;32m 33\u001b[0m \u001b[0;31m# Track/compute gradient and make an optimization step only when training\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_grad_enabled\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mphase\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"train\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 35\u001b[0;31m \u001b[0moutputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 36\u001b[0m \u001b[0m_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpreds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moutputs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 37\u001b[0m \u001b[0mloss\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcriterion\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moutputs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabels\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m_call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1499\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0m_global_backward_pre_hooks\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0m_global_backward_hooks\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1500\u001b[0m or _global_forward_hooks or _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mforward_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1502\u001b[0m \u001b[0;31m# Do not call functions when jit is used\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1503\u001b[0m \u001b[0mfull_backward_hooks\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnon_full_backward_hooks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.10/dist-packages/torchvision/models/resnet.py\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m 283\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 284\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mTensor\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mTensor\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 285\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_forward_impl\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 286\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 287\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.10/dist-packages/torchvision/models/resnet.py\u001b[0m in \u001b[0;36m_forward_impl\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m 278\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mavgpool\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 279\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mflatten\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 280\u001b[0;31m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 281\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 282\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m_call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1499\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0m_global_backward_pre_hooks\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0m_global_backward_hooks\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1500\u001b[0m or _global_forward_hooks or _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mforward_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1502\u001b[0m \u001b[0;31m# Do not call functions when jit is used\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1503\u001b[0m \u001b[0mfull_backward_hooks\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnon_full_backward_hooks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m<ipython-input-30-b3354772a0b6>\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, input_features)\u001b[0m\n\u001b[1;32m 29\u001b[0m \u001b[0mq_out\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mq_out\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 30\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0melem\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mq_in\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 31\u001b[0;31m \u001b[0mq_out_elem\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhstack\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mquantum_net\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0melem\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mq_params\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munsqueeze\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 32\u001b[0m \u001b[0mq_out\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mq_out\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mq_out_elem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 33\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.10/dist-packages/pennylane/qnode.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 865\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute_kwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"mode\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 866\u001b[0m \u001b[0;31m# pylint: disable=unexpected-keyword-arg\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 867\u001b[0;31m res = qml.execute(\n\u001b[0m\u001b[1;32m 868\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtape\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 869\u001b[0m \u001b[0mdevice\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.10/dist-packages/pennylane/interfaces/execution.py\u001b[0m in \u001b[0;36mexecute\u001b[0;34m(tapes, device, gradient_fn, interface, grad_on_execution, gradient_kwargs, cache, cachesize, max_diff, override_shots, expand_fn, max_expansion, device_batch_transform)\u001b[0m\n\u001b[1;32m 405\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mgradient_fn\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"backprop\"\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0minterface\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 406\u001b[0m return batch_fn(\n\u001b[0;32m--> 407\u001b[0;31m qml.interfaces.cache_execute(\n\u001b[0m\u001b[1;32m 408\u001b[0m \u001b[0mbatch_execute\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcache\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreturn_tuple\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexpand_fn\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mexpand_fn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 409\u001b[0m )(tapes)\n",
"\u001b[0;32m/usr/local/lib/python3.10/dist-packages/pennylane/interfaces/execution.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(tapes, **kwargs)\u001b[0m\n\u001b[1;32m 147\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 148\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtape\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtapes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 149\u001b[0;31m \u001b[0mh\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtape\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhash\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 150\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 151\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mh\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mhashes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.10/dist-packages/pennylane/tape/qscript.py\u001b[0m in \u001b[0;36mhash\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 204\u001b[0m \u001b[0;34m\"\"\"int: returns an integer hash uniquely representing the quantum script\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 205\u001b[0m \u001b[0mfingerprint\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 206\u001b[0;31m \u001b[0mfingerprint\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mop\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhash\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mop\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moperations\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 207\u001b[0m \u001b[0mfingerprint\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhash\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mm\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmeasurements\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 208\u001b[0m \u001b[0mfingerprint\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrainable_params\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.10/dist-packages/pennylane/tape/qscript.py\u001b[0m in \u001b[0;36m<genexpr>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 204\u001b[0m \u001b[0;34m\"\"\"int: returns an integer hash uniquely representing the quantum script\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 205\u001b[0m \u001b[0mfingerprint\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 206\u001b[0;31m \u001b[0mfingerprint\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mop\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhash\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mop\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moperations\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 207\u001b[0m \u001b[0mfingerprint\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhash\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mm\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmeasurements\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 208\u001b[0m \u001b[0mfingerprint\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrainable_params\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.10/dist-packages/pennylane/operation.py\u001b[0m in \u001b[0;36mhash\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 692\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwires\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtolist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 693\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhyperparameters\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 694\u001b[0;31m \u001b[0m_process_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 695\u001b[0m )\n\u001b[1;32m 696\u001b[0m )\n",
"\u001b[0;32m/usr/local/lib/python3.10/dist-packages/pennylane/operation.py\u001b[0m in \u001b[0;36m_process_data\u001b[0;34m(op)\u001b[0m\n\u001b[1;32m 380\u001b[0m \u001b[0;31m# valued QNode (one that returns qml.state) requires complex typed inputs.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 381\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mop\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m\"RX\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"RY\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"RZ\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"PhaseShift\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"Rot\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 382\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mqml\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mround\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mqml\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0md\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mop\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 383\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 384\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mop\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m\"CRX\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"CRY\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"CRZ\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"CRot\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.10/dist-packages/torch/_tensor.py\u001b[0m in \u001b[0;36m__repr__\u001b[0;34m(self, tensor_contents)\u001b[0m\n\u001b[1;32m 424\u001b[0m )\n\u001b[1;32m 425\u001b[0m \u001b[0;31m# All strings are unicode in Python 3.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 426\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_tensor_str\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_str\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtensor_contents\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtensor_contents\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 427\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 428\u001b[0m def backward(\n",
"\u001b[0;32m/usr/local/lib/python3.10/dist-packages/torch/_tensor_str.py\u001b[0m in \u001b[0;36m_str\u001b[0;34m(self, tensor_contents)\u001b[0m\n\u001b[1;32m 634\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mno_grad\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mutils\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_python_dispatch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_disable_current_modes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 635\u001b[0m \u001b[0mguard\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_C\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_DisableFuncTorch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 636\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_str_intern\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtensor_contents\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtensor_contents\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m/usr/local/lib/python3.10/dist-packages/torch/_tensor_str.py\u001b[0m in \u001b[0;36m_str_intern\u001b[0;34m(inp, tensor_contents)\u001b[0m\n\u001b[1;32m 565\u001b[0m \u001b[0mtensor_str\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_tensor_str\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto_dense\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindent\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 566\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 567\u001b[0;31m \u001b[0mtensor_str\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_tensor_str\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindent\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 568\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 569\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlayout\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstrided\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.10/dist-packages/torch/_tensor_str.py\u001b[0m in \u001b[0;36m_tensor_str\u001b[0;34m(self, indent)\u001b[0m\n\u001b[1;32m 325\u001b[0m )\n\u001b[1;32m 326\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 327\u001b[0;31m \u001b[0mformatter\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_Formatter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mget_summarized_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0msummarize\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 328\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0m_tensor_str_with_formatter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindent\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msummarize\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mformatter\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 329\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.10/dist-packages/torch/_tensor_str.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, tensor)\u001b[0m\n\u001b[1;32m 113\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 114\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 115\u001b[0;31m nonzero_finite_vals = torch.masked_select(\n\u001b[0m\u001b[1;32m 116\u001b[0m \u001b[0mtensor_view\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misfinite\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtensor_view\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m&\u001b[0m \u001b[0mtensor_view\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mne\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 117\u001b[0m )\n",
"\u001b[0;31mKeyboardInterrupt\u001b[0m: "
]
}
],
"source": [
"model_hybrid = train_model(\n",
" model_hybrid, criterion, optimizer_hybrid, exp_lr_scheduler, num_epochs=num_epochs\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "s4cEc4mird0E"
},
"source": [
"Visualizing the model predictions\n",
"=================================\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ARvjv_lbrd0E"
},
"source": [
"We first define a visualization function for a batch of test data.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "CtUY4xU_rd0E"
},
"outputs": [],
"source": [
"def visualize_model(model, num_images=6, fig_name=\"Predictions\"):\n",
" images_so_far = 0\n",
" _fig = plt.figure(fig_name)\n",
" model.eval()\n",
" with torch.no_grad():\n",
" for _i, (inputs, labels) in enumerate(dataloaders[\"validation\"]):\n",
" inputs = inputs.to(device)\n",
" labels = labels.to(device)\n",
" outputs = model(inputs)\n",
" _, preds = torch.max(outputs, 1)\n",
" for j in range(inputs.size()[0]):\n",
" images_so_far += 1\n",
" ax = plt.subplot(num_images // 2, 2, images_so_far)\n",
" ax.axis(\"off\")\n",
" ax.set_title(\"[{}]\".format(class_names[preds[j]]))\n",
" imshow(inputs.cpu().data[j])\n",
" if images_so_far == num_images:\n",
" return"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "F6I5Rk92rd0E"
},
"source": [
"Finally, we can run the previous function to see a batch of images with\n",
"the corresponding predictions.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "-RoYcZQXrd0E"
},
"outputs": [],
"source": [
"visualize_model(model_hybrid, num_images=6)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "IBXZTnzjrd0E"
},
"source": [
"References\n",
"==========\n",
"\n",
"\\[1\\] Andrea Mari, Thomas R. Bromley, Josh Izaac, Maria Schuld, and\n",
"Nathan Killoran. *Transfer learning in hybrid classical-quantum neural\n",
"networks*. arXiv:1912.08278 (2019).\n",
"\n",
"\\[2\\] Rajat Raina, Alexis Battle, Honglak Lee, Benjamin Packer, and\n",
"Andrew Y Ng. *Self-taught learning: transfer learning from unlabeled\n",
"data*. Proceedings of the 24th International Conference on Machine\n",
"Learning\\*, 759--766 (2007).\n",
"\n",
"\\[3\\] Kaiming He, Xiangyu Zhang, Shaoqing ren and Jian Sun. *Deep\n",
"residual learning for image recognition*. Proceedings of the IEEE\n",
"Conference on Computer Vision and Pattern Recognition, 770-778 (2016).\n",
"\n",
"\\[4\\] Ville Bergholm, Josh Izaac, Maria Schuld, Christian Gogolin,\n",
"Carsten Blank, Keri McKiernan, and Nathan Killoran. *PennyLane:\n",
"Automatic differentiation of hybrid quantum-classical computations*.\n",
"arXiv:1811.04968 (2018).\n",
"\n",
"About the author\n",
"================\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.16"
},
"colab": {
"provenance": [],
"gpuType": "V100"
},
"accelerator": "GPU",
"gpuClass": "standard"
},
"nbformat": 4,
"nbformat_minor": 0
}